import { getMenu } from '@/api/login';
import { asyncRouterMap, constantRouterMap } from '@/router';

/**
 * 通过meta.role判断是否与当前用户权限匹配
 * @param roles
 * @param route
 */
// function hasPermission(roles, route) {
//   if (route.meta && route.meta.roles) {
//     return roles.some(role => route.meta.roles.indexOf(role) >= 0)
//   } else {
//     return true
//   }
// }

/**
 * 递归过滤异步路由表，返回符合用户角色权限的路由表
 * @param asyncRouterMap
 * @param roles
 */
// function filterAsyncRouter(asyncRouterMap, roles) {
//   const accessedRouters = asyncRouterMap.filter(route => {
//     if (hasPermission(roles, route)) {
//       if (route.children && route.children.length) {
//         route.children = filterAsyncRouter(route.children, roles)
//       }
//       return true
//     }
//     return false
//   })
//   return accessedRouters
// }

/**
 * 将getMenu方法返回的menus进行整合，返回符合用户角色权限的路由表
 * @param routerMap
 * @param menus
 */
function filterAsyncRouter(routerMap, menu) {
  const accessedRouters = routerMap.filter(route => {
    if (route.hidden || route.id === -1) {
      return true;
    } else {
      for (const i in menu) {
        if (route.id === menu[i].id) {
          if (route.children && route.children.length) {
            route.children = filterAsyncRouter(route.children, menu[i].child);
          }
          return true;
        } else if (route.id === 0) { // 0代表新页面
          return false;
        // } else if (route.id === -1) { // -1代表永远显示页面
        //   return true
        }
      }
      return false;
    }
  })
  return accessedRouters;
}

/**
 * 将getMenu方法返回的menus进行整合，返回符合用户角色权限的路由表
 * @param asyncRouterMap
 * @param menus
 */
// 用路由规则作为权限控制
// function filterAsyncRouter2(asyncRouterMap, menu) {
//   const accessedRouters = asyncRouterMap.filter(route => {
//     for (const i in menu) {
//       if (route.meta && route.meta['power'] === menu[i]['name']) {
//         route.meta['title'] = menu[i].label
//         if (route.children && route.children.length) {
//           route.children = filterAsyncRouter(route.children, menu[i].child)
//         }
//         return true
//       } else if (route.id === 0) { // 0代表新页面
//         return false
//       } else if (route.id === -1) { // -1代表永远显示页面
//         return true
//       }
//     }
//   })
//   return accessedRouters
// }

const permission = {
  state: {
    routers: constantRouterMap,
    addRouters: [],
    permissionId: []
  },
  mutations: {
    SET_ROUTERS: (state, routers) => {
      state.addRouters = routers;
      state.routers = constantRouterMap.concat(routers);
    }
  },
  actions: {
    GetMenu({ commit, state }) {
      return new Promise((resolve, reject) => {
        getMenu().then(response => {
          const data = response.data;
          const temp = [];
          data.forEach(item => {
            temp.push(item.id);
            if (item.child && item.child.length) {
              item.child.forEach(item2 => {
                item2.id && temp.push(item2.id)
                if (item2.child && item2.child.length) {
                  item2.child.forEach(item3 => {
                    item3.id && temp.push(item3.id);
                  })
                }
              })
            }
          })
          // 用路由规则作为权限控制
          // data.menu.forEach(item => {
          //   temp.push(item.name)
          //   if (item.child && item.child.length) {
          //     item.child.forEach(item2 => {
          //       item2.name && temp.push(item2.name)
          //       if (item2.child && item2.child.length) {
          //         item2.child.forEach(item3 => {
          //           item3.name && temp.push(item3.name)
          //         })
          //       }
          //     })
          //   }
          // })
          state.permissionId = temp;

          commit('SET_ROLES', data);
          if (data && data.length > 0) { // 验证返回的roles是否是一个非空数组
            commit('SET_ROLES', data);
          } else {
            // reject('getInfo: roles must be a non-null array !')
            commit('SET_ROLES', [-1]);
          }
          // commit('SET_NAME', data.name)
          // commit('SET_AVATAR', data.avatar)
          resolve(response);
        }).catch(error => {
          reject(error);
        })
      })
    },

    GenerateRoutes({ commit }, data) {
      return new Promise(resolve => {
        const { menu } = data;
        // let accessedRouters
        // if (roles.indexOf('admin') >= 0) {
        //   accessedRouters = asyncRouterMap
        // } else {
        // console.log(data)
        const accessedRouters = filterAsyncRouter(asyncRouterMap, menu);
        // const accessedPluginRouters = filterAsyncRouter(asyncPluginRouterMap, plugin)
        // }

        // console.log(accessedRouters)
        // console.log(accessedPluginRouters)

        // 进行排序让系统设置在最后面
        // const temp = []
        // for (var i = 0; i < (accessedRouters.length + accessedPluginRouters.length); i++) {
        //   if (i < accessedRouters.length - 1) {
        //     temp.push(accessedRouters[i])
        //   } else if (i < (accessedRouters.length + accessedPluginRouters.length - 3)) {
        //     temp.push(accessedPluginRouters[i - accessedRouters.length + 1])
        //   } else if (i < accessedRouters.length + accessedPluginRouters.length - 2) {
        //     temp.push(accessedRouters[accessedRouters.length - 1])
        //   } else {
        //     temp.push(accessedPluginRouters[i - accessedRouters.length])
        //   }
        // }
        // console.log(accessedRouters.concat(accessedPluginRouters))
        commit('SET_ROUTERS', accessedRouters);
        resolve();
      })
    }
  }
}

export default permission;
